﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;

namespace Draco.Commons.Reflection
{
    /// <summary>
    /// 反射辅助类型
    /// </summary>
    public class ReflectUtils
    {
        /// <summary>
        /// 解析程序集名称
        /// </summary>
        /// <param name="longName"></param>
        /// <returns></returns>
        public static AssemblyName ParseAssemblyName(string longName)
        {
            if (!String.IsNullOrEmpty(longName))
            {
                /**
                 * 第1种形式--标准弱程序集名称：Draco.Security
                 * 第2种形式--标准强程序集名称：System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
                 * 第3种形式--全路径程序集名称：C:\\assambly\\MyAssembly.dll
                 * 第4种形式--带类型的弱命名程序集:Draco.HttpModule.MyHttpModule, Draco.HttpModule
                 * 第5种形式--带类型的强命名程序集：System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
                 * 第6种形式--带方法的程序集名称：CreateId@Draco.HttpModule.MyHttpModule, Draco.HttpModule
                 * */
                if (longName.Contains("/") || longName.Contains("\\"))
                {
                    //首先处理第3种形式
                    String aName = longName = System.IO.Path.GetFileName(longName);
                    aName = aName.Trim();
                    if (aName.ToLower().EndsWith(".dll"))
                        aName = aName.Substring(0, aName.Length - 4);
                    return new AssemblyName(aName);
                }
                //第2、4、5、7中形式都包含逗号
                String[] parts = longName.Split(new char[]{','}, StringSplitOptions.RemoveEmptyEntries);
                if (parts.Length == 1)
                {
                    //第1种形式，不包含逗号，弱命名程序集名称
                    return new AssemblyName(parts[0]);
                }
                if (parts.Length == 2)
                {
                    //第4、6种形式，带类型或方法的弱命名程序集名称
                    return new AssemblyName(parts[1]);
                }
                if (parts.Length == 4)
                {
                    //第2种形式，强命名程序集
                    return new AssemblyName(longName);
                }
                if (parts.Length == 5)
                {
                    //处理第5种形式,带类型的强命名程序集
                    int index = longName.IndexOf(",");//第一个逗号
                    string secondName = longName.Substring(index + 1);
                    return new AssemblyName(secondName);
                }
            }
            return null;
        }
        /// <summary>
        /// 解析类全名称
        /// </summary>
        /// <param name="longName"></param>
        /// <returns></returns>
        public static string ParseClassName(string longName)
        {
            if (!String.IsNullOrEmpty(longName))
            {
                /**
                 * 第1种形式--带类型的弱命名程序集:Draco.HttpModule.MyHttpModule, Draco.HttpModule
                 * 第2种形式--带类型的强命名程序集：System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
                 * 第3种形式--带方法的程序集名称：CreateId@Draco.HttpModule.MyHttpModule, Draco.HttpModule
                 * */
                if (longName.Contains(","))//标准程序集名称
                {
                    //第1、2、3种形式
                    int index = longName.IndexOf(",");//第一个逗号
                    string TypeName = longName.Substring(0, index);
                    TypeName = TypeName.Replace(" ", "");//删除空格
                    
                    //检测TypeName中是否包含有@分隔的方法名称
                    int i = TypeName.IndexOf("@", 1);
                    if (i > 0 && i < TypeName.Length-1 && TypeName[i - 1] != '.')
                    {
                        //@符号可以作为命名空间、类型名称、方法名的前缀，但不能在名称中间包含@
                        TypeName = TypeName.Substring(i + 1);
                    }
                    return TypeName;
                }
            }
            return "";
        }
        /// <summary>
        /// 解析方法名称
        /// </summary>
        /// <param name="longName"></param>
        /// <returns></returns>
        public static string ParseMethodName(string longName)
        {
            if (!String.IsNullOrEmpty(longName))
            {
                /**
                 * 第1种形式--带方法的程序集名称：CreateId@Draco.HttpModule.MyHttpModule, Draco.HttpModule
                 * */
                if (longName.Contains(","))
                {
                    int index = longName.IndexOf(",");//第一个逗号
                    string TypeName = longName.Substring(0, index);
                    TypeName = TypeName.Replace(" ", "");//删除空格
                    int i = TypeName.IndexOf("@", 1);
                    if (i > 0 && i < TypeName.Length - 1 && TypeName[i - 1] != '.')
                    {
                        string MethodName = TypeName.Substring(0,i);
                        return MethodName;
                    }
                }
            }
            return "";
        }
    }
}
